package br.com.tcc.systemdx.service;

import java.util.Set;

import br.com.tcc.systemdx.domain.AtributoSintoma;
import br.com.tcc.systemdx.domain.DescricaoDoenca;
import br.com.tcc.systemdx.domain.FatorRelevante;
import br.com.tcc.systemdx.domain.Sintoma;
import br.com.tcc.systemdx.domain.ValorSintoma;
import br.com.tcc.systemdx.service.beans.GeradorConjuntos;
import br.com.tcc.systemdx.service.beans.QuestaoHipotese;

/**
 * Interface do mecanismo de inferência do sistema.
 * Aqui é onde a mágica acontece :)
 * 
 * @author Rico
 *
 */
public interface MecanismoInferenciaService {
	
	/**
	 * Inicializa todos os componentes do mecanismo de inferência para
	 * um novo ciclo de teste de hipóteses. Sempre deve ser chamado quando se deseja
	 * iniciar um novo ciclo.
	 */
	void inicializarCicloTesteHipoteses();
	
	/**
	 * Inicializa o mecanismo de inferência para um novo ciclo de teste de hipóteses
	 * com valor inicial de sintoma presente (atributo e valor).
	 * @param sintomaInicial
	 */
	void inicializarCicloTesteHipoteses(Long atributoSintomaId, Long valorSintomaId);
	
	/**
	 * Retorna uma nova questão associada ao ciclo teste de hipóteses iniciado.
	 * @return questão do ciclo ou null caso não haja ciclo em execução.
	 */
	QuestaoHipotese obterNovaQuestaoHipoteseSintoma();
	
	/**
	 * Responde a última questão hipótese obtida
	 */
	void responderQuestaoHipoteseSintoma(QuestaoHipotese questaoRespondida);
	
	/**
	 * Método que indica se um ciclo de teste de hipóteses está em execução.
	 * @return true se estiver, false caso contrário.
	 */
	boolean isCicloTesteHipoteseEmAndamento();
	
	/**
	 * Método utilizado para verificar se um ciclo de teste de hipóteses
	 * foi finalizado com sucesso.
	 * @return true em caso de sucesso, false caso contrário.
	 */
	boolean isCicloTesteHipoteseFinalizado();
	
	/**
	 * Retorna o escopo do diagnóstico durante a execução da inferência
	 * @return
	 */
	Set<DescricaoDoenca> getEscopoDiagnostico();
	
	/**
	 * Retorna o conjunto de todos os sintomas identificados até o momento
	 * @return
	 */
	Set<Sintoma> getManifestacoes();
	
	/**
	 * Retorna o conjunto de todos os fatores relevantes identificados até o momento
	 * @return
	 */
	Set<FatorRelevante> getFatoresPresentes();
	
	/**
	 * Retorna o conjunto de todas as soluções de diagnósticos encontradas até o momento
	 * @return
	 */
	Set<GeradorConjuntos> getFoco();
	
	/**
	 * Executa o ciclo teste de hipóteses diretamente.  
	 * @param atributo
	 * @param valor
	 */
	void executarCicloTesteHipotese(AtributoSintoma atributo, ValorSintoma valor);

}
